// 密封(seal)对象

const descriptor = {
    enumerable: true , 
    writable: true, 
    configurable: true 
}

const properties = {
    // 用展开运算符(...)将一个对象展开
    id: { value: 1001, ...descriptor },
    name: { value: '阿芳', ...descriptor }
}

const x = Object.create(null, properties);

// Object.isSealed( object )
// 作用: 判断指定对象(object)是否被密封
// 返回: 当指定对象被密封时返回 true
console.log( Object.isSealed( x ) ); // false

// 动态为实例添加属性
x.gender = '女';
// 用defineProperty定义新属性
Object.defineProperty(x, 'age', { value: 18, enumerable: true, writable: false, configurable: true } );
console.log( x );

// 尝试配置属性(比如删除已有属性)
delete x.id;
console.log( x );
console.log( Object.getOwnPropertyDescriptor(x, 'age') );
// 尝试配置属性(比如修改已有属性的描述符)
Object.defineProperty(x, 'age', { enumerable: false, writable: true, configurable: false } );
console.log( Object.getOwnPropertyDescriptor(x, 'age') );

// Object.seal( object )
// 作用: 密封指定对象(object)
// 返回: 返回密封后的对象(即参数传入的对象)
let y = Object.seal( x ); // 封闭指定对象
console.log( y === x ); // true

// 替换属性值
x.name = '小芳';
console.log( x );
